
#ifndef _RADIX_ENGINE_IMPL_SCENE_H_
#define _RADIX_ENGINE_IMPL_SCENE_H_

#include <Engine/Scene.h>

_BeginNamespace(Radix)
/*
=================================================================
== Node
=================================================================
*/
class Node :public INode
{
public:
	Node(const String& name, INode* parent);
	virtual ~Node();

public:
	virtual const String& name();
	virtual INode* parent();
	virtual INode* child(const String& nodeName);
	virtual INode* createChild(const String& nodeName);
	virtual void deleteChild(const String& nodeName);
	virtual void deleteChildren();

	virtual IEntity* entity();
	virtual bool attachEntity(IEntity* entity);
	virtual void detachEntity();

private:
	String mName;
	INode* mParent;
	Table<String, INode> mChildren;
	IEntity* mEntity;
};
/*
=================================================================
== UniverseScene
=================================================================
*/
class UniverseScene :public IScene
{
public:
	UniverseScene(const String& name);
	virtual ~UniverseScene();

public:
	virtual const String& name();
	virtual const String& type();
	virtual INode* rootNode();

private:
	String mName;
	INode* mRootNode;
};
/*
=================================================================
== TerrainScene
=================================================================
*/
class TerrainScene :public IScene
{
public:
	TerrainScene(const String& name);
	virtual ~TerrainScene();

public:
	virtual const String& name();
	virtual const String& type();
	virtual INode* rootNode();

private:
	String mName;
	INode* mRootNode;
};
/*
=================================================================
== IndoorScene
=================================================================
*/
class IndoorScene :public IScene
{
public:
	IndoorScene(const String& name);
	virtual ~IndoorScene();

public:
	virtual const String& name();
	virtual const String& type();
	virtual INode* rootNode();

private:
	String mName;
	INode* mRootNode;
};
/*
=================================================================
== SceneSystem
=================================================================
*/
class SceneSystem :public ISceneSystem
{
public:
	SceneSystem();
	virtual ~SceneSystem();

public:
	virtual IScene* createScene(const String& name, const String& type);
	virtual IScene* selectScene(const String& name);
	virtual void deleteScene(const String& name);
	virtual void deleteScenes();
	
	virtual IEntity* createEntity(const String& name, const EntityType& type);
	virtual IEntity* selectEntity(const String& name);
	virtual void deleteEntity(const String& name);
	virtual void deleteEntities();

private:

};

_EndNamespace(Radix)

#endif//_RADIX_ENGINE_IMPL_SCENE_H_
